package genetica.algoritmoSeleccion;

import genetica.cromosomas.Cromosoma;
import genetica.cromosomas.factorias.FactoriaCromosomas;

import java.util.ArrayList;
import java.util.Random;

public class ASRuleta extends AlgoritmoSeleccion {

	@Override
	public ArrayList<Cromosoma> seleccion(ArrayList<Cromosoma> pob, FactoriaCromosomas<Cromosoma> fc) {
		
		ArrayList<Integer> sel_super = new ArrayList<Integer>(); // Seleccionados para sobrevivir
		double 	prob; // probabilidad de seleccion
		int 	pos_super; //posicion del superviviente
		Random 	r = new Random();
		
		for(int i=0; i<pob.size();i++){
			prob = r.nextDouble();
			pos_super = pob.size()-1;
			// TODO esta no va cuando todos tienen la misma probabilidad
			while((prob < pob.get(pos_super).getPuntAcum()-pob.get(pos_super).getPuntuacion())) //|| (pos_super < pob.size())) TODO esto no es necesario pero si se pone NUNCA CON UN or sino con un &&
				pos_super --;
			
			sel_super.add(pos_super);
		}
		// Si haces el new adjudicas un nuevo valor al puntero con lo que no se modficia el puntero original. Soluciones:
		// Devolverlo como parametro de funcion
		// Crear el nuevo arrayList en la llamada a la funcion
		ArrayList<Cromosoma> nuevaPob = new ArrayList<Cromosoma>(pob.size());
		
		for(int i=0; i < pob.size(); i++){
			nuevaPob.add(fc.copia(pob.get(sel_super.get(i))));
		}
		return nuevaPob;
		
	}
	
	@Override
	public String toString(){
		return "Algoritmo de seleccion por Ruleta";
	}
}
